1、 pinctrl 子系统功能
	pinctrl 子系统用于从设备树获取引脚配置信息完成对引脚功能和电气特性的配置。

2、 pin-controller 节点介绍
	stm32mp157 的引脚配置信息通过节点 pinctrl: pin-controller@50002000 来描述，如下是 pinctrl: pin-controlle
r@50002000 节点展开后的内容：
		pinctrl: pin-controller@50002000 {
			#address-cells = <1>;					//表示pinctrl 中 reg 属性的地址为长度为32位
			#size-cells = <1>;						//表示pinctrl 中 reg 属性的地址范围为长度为32位
			compatible = "st,stm32mp157-pinctrl";	//驱动匹配名称
			ranges = <0 0x50002000 0xa400>;			//地址映射范围，PA~PK 这 11 组 GPIO 的寄存器都在一起，其
													//起始地址为 0X50002000，终止地址为0X5000C3FF
			interrupt-parent = <&exti>;				//表示父中断控制器位exti
			st,syscfg = <&exti 0x60 0xff>;
			hwlocks = <&hsem 0 1>;
			pins-are-numbered;

			gpioa: gpio@50002000 {
				gpio-controller;			//表示此节点是一个GPIO控制器
				#gpio-cells = <2>;			//表示引用此GPIO节点时要传递2个参数
				interrupt-controller;		//表示此节点是一个中断控制器
				#interrupt-cells = <2>;		//表示使用此中断控制器时需要传递两个参数
				reg = <0x0 0x400>;			// GPIOA 控制器的寄存器基地址偏移为 0X400
				clocks = <&rcc GPIOA>;		//clocks 属性指定这个 GPIOA 控制器的时钟。
				st,bank-name = "GPIOA";
				status = "disabled";
			};
			......
			m_can1_pins_a: m-can1-0 {
				pins1 {
					pinmux = <STM32_PINMUX('H', 13, AF9)>; 		//配置引脚互用功能，参考<<STM32MP157A&D 数据手册>>
					//引脚电器特性:
					//	bias-disable		bootlean		禁止使用內部偏置电压
					//	bias-pull-down		bootlean		内部下拉
					//	bias-pull-up		bootlean		内部上拉
					//	drive-push-pull		bootlean		推挽输出
					//	drive-open-drain	bootlean		开漏输出
					//	output-low			bootlean		输出低电平
					//	output-high			bootlean		输出高电平
					//	slew-rate			enum			引脚的速度，可设置： 0~3， 0 最慢， 3 最高
					slew-rate = <1>;
					drive-push-pull;
					bias-disable;
				};
				pins2 {
					pinmux = <STM32_PINMUX('I', 9, AF9)>; /* CAN1_RX */
					bias-disable;
				};
			};
			
			m_can1_sleep_pins_a: m_can1-sleep-0 {
				pins {
					pinmux = <STM32_PINMUX('H', 13, ANALOG)>, /* CAN1_TX */
						<STM32_PINMUX('I', 9, ANALOG)>; /* CAN1_RX */
				};
			};
			
			pwm1_pins_a: pwm1-0 {
				pins {
					pinmux = <STM32_PINMUX('E', 9, AF1)>, /* TIM1_CH1 */
						<STM32_PINMUX('E', 11, AF1)>, /* TIM1_CH2 */
						<STM32_PINMUX('E', 14, AF1)>; /* TIM1_CH4 */
					bias-pull-down;
					drive-push-pull;
					slew-rate = <0>;
				};
			};
			......
		};
3、添加 pinctrl 节点
	可以在 pinctrl: pin-controller@50002000 节点中添加自己的 pinctrl 节点，用于配置 pin。 添加方式如下：
		在根节点外通过 &pinctrl 引用 pinctrl: pin-controller@50002000 节点，然后在内部添加或修改相应的 pinct
	rl 节点，其格式如下
		&pinctrl {
			//添加一个名字为uart4_pins的节点来描述uart4的pin信息
			uart4_pins: uart4-0 {
				//添加一个pins节点，用于描述外设所使用的pin，同一个pins节点下的pin电气特性相同
				pins1 {
					pinmux = <STM32_PINMUX('G', 11, AF6)>; /* UART4_TX */
					bias-disable;
					drive-push-pull;
					slew-rate = <0>;
				};
				pins2 {
					pinmux = <STM32_PINMUX('B', 2, AF8)>; /* UART4_RX */
					bias-disable;
				};
			};
		}
4、pinctrl 子系统与总线设备驱动框架的关系
	在总线设备驱动框架中，调用 probe 函数之前会初始化 pinctrl-names 为 "default" 的 pinctrl 节点所描述的引脚。
5、使用 pinctrl 子系统
	在描述设备的节点中 pinctrl-n(n从0开始) 引用相应的 pinctrl 节点即可。
	&uart4 {
		//分别指定pinctrl-0~pinctrl-2的名称为"default", "sleep", "idle"
		pinctrl-names = "default", "sleep", "idle";
		pinctrl-0 = <&uart4_pins_a>;
		pinctrl-1 = <&uart4_sleep_pins_a>;
		pinctrl-2 = <&uart4_idle_pins_a>;
		/delete-property/dmas;
		/delete-property/dma-names;
		status = "okay";
	};
6、pinctrl 子系统与 gpio 子系统关系
	如果 pinctrl 子系统将一个 PIN 复用为 GPIO ，则可以通过 GPIO 子系统对其进行控制，在 STM32MP15X 中如果将中
将 pin 作为 GPIO 使用时无需添加相应的 pinctrl 节点，它默认将 PIN 作为 GPIO 使用（但是有些 SOC ，如 imx 系列
则需要显示的将 PIN 设置为 GPIO 描述）。
7、在设备树中使用GPIO
	在需要的设备加入描述GPIO的属性即可，如下是一个使用 GPIO 的 LED 节点(两种写法均可)：
	led {
		compatible = "atk,led";
		led-gpios = <&gpioi 0 GPIO_ACTIVE_LOW>,
					<&gpioi 1 GPIO_ACTIVE_LOW>;
		status = "okay";
	};
	led {
		compatible = "atk,led";
		led-gpios = <&gpioi 0 GPIO_ACTIVE_LOW
					&gpioi 1 GPIO_ACTIVE_LOW>;
		status = "okay";
	};
8、gpio 子系统相关函数
	常用的 GPIO 函数：
	gpio_request 申请 GPIO 管脚
	gpio_free 释放 GPIO 管脚
	gpio_direction_input 设置 GPIO 为输入
	gpio_direction_output 设置 GPIO 为输出
	gpio_get_value 获取 GPIO 的值
	gpio_set_value 设置 GPIO 的值
	of_get_named_gpio 从设备树获取 GPIO 的编号，需要在设备树中添加 GPIO 信息
	of_get_gpio_flags 从设备树获取 GPIO 的编号及特性，描述 GPIO 的属性名称必须为 gpios
	of_get_named_gpio_flags 从设备树获取 GPIO 的编号及特性
	gpio_to_desc 获取GPIO描述信息
	of_gpio_named_count 获取设备树某个属性里面的GPIO信息数量
	of_gpio_count 获取设备树某个属性里面的GPIO数量，描述 GPIO 的属性名称必须为 gpios
